package com.dys.testarraylist12;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @className: com.dys.testarraylist12.ArrayListTest
 * @description: com.dys.testarraylist12
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/10 下午4:59
 */
public class ArrayListTest {

    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        new ArrayListTest().testThreadSafety();
    }

    /**
     * 线程不安全
     */
    public void testThreadUnsafe() {
        // 创建一个ArrayList集合：
        ArrayList<String> list = new ArrayList<>();

        // 创建一个线程池,线程池定长为100
        ExecutorService es = Executors.newFixedThreadPool(10000);
        // 并发向集合中添加10000000个数据：
        for (int i = 0; i < 10000000; i++) {
            // 每个线程处理任务：run方法中的内容就是线程单元，任务：实际执行线程的部分
            int finalI = i;
            es.execute(new Runnable() {

                @Override
                public void run() {
                    if (finalI % 5 == 0) {
                        list.add("AAAAA");
                    } else {
                        list.add("BBBBB");
                    }
                }
            });
        }

        // 关闭线程池
        es.shutdown();

        // 监控线程是否执行完毕
        while (true) {
            // 线程都执行完以后，返回true
            if (es.isTerminated()) {
                System.out.println("所有子线程都执行完毕了!");
                // 执行完毕后看一下集合中元素的数量
                System.out.println(list.size());
                if (list.size() == 10000000) {
                    System.out.println("线程安全!");
                } else {
                    System.out.println("线程不安全!");
                }
                // 线程执行完以后，while循环可以停止：
                break;
            }
        }
    }

    /**
     * 线程安全
     */
    public void testThreadSafety() {
        // 创建一个ArrayList集合：
        ArrayList<String> oldList = new ArrayList<>();
        // 将线程不安全的集合转为线程安全的集合
        List<String> list = Collections.synchronizedList(oldList);
        // 创建一个线程池,线程池定长为100
        ExecutorService es = Executors.newFixedThreadPool(10000);
        // 并发向集合中添加10000000个数据：
        for (int i = 0; i < 10000000; i++) {
            // 每个线程处理任务：run方法中的内容就是线程单元，任务：实际执行线程的部分
            int finalI = i;
            es.execute(new Runnable() {

                @Override
                public void run() {
                    if (finalI % 5 == 0) {
                        list.add("AAAAA");
                    } else {
                        list.add("BBBBB");
                    }
                }
            });
        }

        // 关闭线程池
        es.shutdown();

        // 监控线程是否执行完毕
        while (true) {
            // 线程都执行完以后，返回true
            if (es.isTerminated()) {
                System.out.println("所有子线程都执行完毕了!");
                // 执行完毕后看一下集合中元素的数量
                System.out.println(list.size());
                if (list.size() == 10000000) {
                    System.out.println("线程安全!");
                } else {
                    System.out.println("线程不安全!");
                }
                // 线程执行完以后，while循环可以停止：
                break;
            }
        }
    }
}
